<?php
/**
* 生成HTML摘要 nece001@163.com
* @param string $html html内容
* @param int $max 摘要长度
* @param string $suffix 后缀
* [url=home.php?mod=space&uid=320818]@return[/url] string
*/
function htmlSummary($html, $max, $suffix='')
{
        $non_paired_tags = array('br', 'hr', 'img', 'input', 'param'); // 非成对标签
        $html = trim($html);
        $count = 0; // 有效字符计数(一个HTML实体字符算一个有效字符)
        $tag_status = 0; // (0:非标签, 1:标签开始, 2:标签名开始, 3:标签名结束)
        $nodes = array(); // 存放解析出的节点(文本节点:array(0, '文本内容', 'text', 0), 标签节点:array(1, 'tag', 'tag_name', '标签性质:0:非成对标签,1:成对标签的开始标签,2:闭合标签'))
        $segment = ''; // 文本片段
        $tag_name = ''; // 标签名
        for($i=0;$i<strlen($html);$i++)
        {
                $char = $html[$i]; // 当前字符

                $segment .= $char; // 保存文本片段

                if($tag_status == 4)
                {
                        $tag_status = 0;
                }

                if($tag_status == 0 && $char == '<')
                {
                        // 没有开启标签状态,设置标签开启状态
                        $tag_status = 1;
                }

                if($tag_status == 1 && $char != '<')
                {
                        // 标签状态设置为开启后,用下一个字符来确定是一个标签的开始
                        $tag_status = 2; //标签名开始
                        $tag_name = ''; // 清空标签名

                        // 确认标签开启,将标签之前保存的字符版本存为文本节点
                        $nodes[] = array(0, substr($segment, 0, strlen($segment)-2), 'text', 0);
                        $segment = '<'.$char; // 重置片段,以标签开头
                }

                if($tag_status == 2)
                {
                        // 提取标签名
                        if($char == ' ' || $char == '>' || $char == "\t")
                        {
                                $tag_status = 3; // 标签名结束
                        }else
                        {
                                $tag_name .= $char; // 增加标签名字符
                        }
                }

                if($tag_status == 3 && $char == '>')
                {
                        $tag_status = 4; // 重置标签状态
                        $tag_name = strtolower($tag_name);

                        // 跳过成对标签的闭合标签
                        $tag_type = 1;
                        if(in_array($tag_name, $non_paired_tags))
                        {
                                // 非成对标签
                                $tag_type = 0;
                        }elseif($tag_name[0] == '/')
                        {
                                $tag_type = 2;
                        }

                        // 标签结束,保存标签节点
                        $nodes[] = array(1, $segment, $tag_name, $tag_type);
                        $segment = ''; // 清空片段
                }

                if($tag_status == 0)
                {
                        //echo $char.')'.$count."\n";
                        if($char == '&')
                        {
                                // 处理HTML实体,10个字符以内碰到';',则认为是一个HTML实体
                                for($e=1;$e<=10;$e++)
                                {
                                        if($html[$i+$e] == ';')
                                        {
                                                $segment .= substr($html, $i+1, $e); // 保存实体
                                                $i += $e; // 跳过实体字符所占长度
                                                break;
                                        }
                                }
                        }else
                        {
                                // 非标签情况下检查有效文本
                                $char_code = ord($char); // 字符编码
                                if($char_code >= 224) // 三字节字符
                                {
                                        $segment .= $html[$i+1].$html[$i+2]; // 保存字符
                                        $i += 2; // 跳过下2个字符的长度
                                }elseif($char_code >= 129) // 双字节字符
                                {
                                        $segment .= $html[$i+1];
                                        $i += 1; // 跳过下一个字符的长度
                                }
                        }

                        $count ++;
                        if($count == $max)
                        {
                                $nodes[] = array(0, $segment.$suffix, 'text');
                                break;
                        }
                }
        }

        $html = '';
        $tag_open_stack = array(); // 成对标签的开始标签栈
        for($i=0;$i<count($nodes);$i++)
        {
                $node = $nodes[$i];
                if($node[3] == 1)
                {
                        array_push($tag_open_stack, $node[2]); // 开始标签入栈
                }elseif($node[3] == 2)
                {
                        array_pop($tag_open_stack); // 碰到一个结束标签,出栈一个开始标签
                }
                $html .= $node[1];
        }

        while($tag_name = array_pop($tag_open_stack)) // 用剩下的未出栈的开始标签补齐未闭合的成对标签
        {
                $html .= '</'.$tag_name.'>';
        }
        return $html;
}

//上面的效果不是很好，无法清楚p标签
function cutstr($string, $length,$charset,$dot) {//字符，截取长度，字符集，结尾符
	if(strlen($string) <= $length) {
		return $string;
	}
    $string = htmlspecialchars(str_replace('<br/>','',$string));
	$string = str_replace(' ','',$string);//半角
	$string = str_replace('　','',$string);//全角
	$pre = chr(1);
	$end = chr(1);
	//保护特殊字符串
	$string = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;'), array($pre.'&'.$end, $pre.'"'.$end, $pre.'<'.$end, $pre.'>'.$end), $string);
 
	$strcut = '';
	if(strtolower($charset) == 'utf-8') {
		$n = $tn = $noc = 0;
		while($n < strlen($string)) {
 
			$t = ord($string[$n]);
			if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
				$tn = 1; $n++; $noc++;
			} elseif(194 <= $t && $t <= 223) {
				$tn = 2; $n += 2; $noc += 2;
			} elseif(224 <= $t && $t <= 239) {
				$tn = 3; $n += 3; $noc += 2;
			} elseif(240 <= $t && $t <= 247) {
				$tn = 4; $n += 4; $noc += 2;
			} elseif(248 <= $t && $t <= 251) {
				$tn = 5; $n += 5; $noc += 2;
			} elseif($t == 252 || $t == 253) {
				$tn = 6; $n += 6; $noc += 2;
			} else {
				$n++;
			}
 
			if($noc >= $length) {
				break;
			}
 
		}
		if($noc > $length) {
			$n -= $tn;
		}
 
		$strcut = substr($string, 0, $n);
 
	} else {
 
		for($i = 0; $i < $length; $i++) {
			$strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
		}
	}
 
	//还原特殊字符串
	$strcut = str_replace(array($pre.'&'.$end, $pre.'"'.$end, $pre.'<'.$end, $pre.'>'.$end), array('&amp;', '&quot;', '&lt;', '&gt;'), $strcut);
 
	//修复出现特殊字符串截段的问题
	$pos = strrpos($s, chr(1));
	if($pos !== false) {
		$strcut = substr($s,0,$pos);
	}
	//$strcut = str_replace(' ','',$strcut);//半角
	//$strcut = str_replace('　','',$strcut);//全角
	$search = array(" ","　","\n","\r","\t");  
	$replace = array("","","","","");  
	$strcut = str_replace($search, $replace, $strcut); 
	return $strcut.$dot;
}
//分页函数
function show_page($count,$page,$page_size)
{
    $page_count  = ceil($count/$page_size);  //计算得出总页数
 
    $init=1;
    $page_len=7;
    $max_p=$page_count;
    $pages=$page_count;
 
    //判断当前页码
    $page=(empty($page)||$page<0)?1:$page;
    //获取当前页url
    $url = $_SERVER['REQUEST_URI'];
    //去掉url中原先的page参数以便加入新的page参数
    $parsedurl=parse_url($url);
    $url_query = isset($parsedurl['query']) ? $parsedurl['query']:'';
    if($url_query != ''){
        $url_query = preg_replace("/(^|&)page=$page/",'',$url_query);
        $url = str_replace($parsedurl['query'],$url_query,$url);
        if($url_query != ''){
            $url .= '&';
        }
    } else {
        $url .= '?';
    }
     
    //分页功能代码
    $page_len = ($page_len%2)?$page_len:$page_len+1;  //页码个数
    $pageoffset = ($page_len-1)/2;  //页码个数左右偏移量
 
    $navs='';
    if($pages != 0){
        if($page!=1){
            $navs.="<a href=\"".$url."page=1\">首页</a>";        //第一页
            $navs.="<a href=\"".$url."page=".($page-1)."\">上页</a>"; //上一页
        } else {
            $navs .= "<a href=\"".$url."page=1\">首页</a>";
            $navs .= "<a href=\"".$url."page=1\">上页</a>";
        }
        if($pages>$page_len)
        {
            //如果当前页小于等于左偏移
            if($page<=$pageoffset){
                $init=1;
                $max_p = $page_len;
            }
            else  //如果当前页大于左偏移
            {    
                //如果当前页码右偏移超出最大分页数
                if($page+$pageoffset>=$pages+1){
                    $init = $pages-$page_len+1;
                }
                else
                {
                    //左右偏移都存在时的计算
                    $init = $page-$pageoffset;
                    $max_p = $page+$pageoffset;
                }
            }
        }
        for($i=$init;$i<=$max_p;$i++)
        {
            if($i==$page){$navs.="<span>".$i.'</span>';} 
            else {$navs.=" <a href=\"".$url."page=".$i."\">".$i."</a>";}
        }
        if($page!=$pages)
        {
            $navs.=" <a href=\"".$url."page=".($page+1)."\">下页</a>";//下一页
            $navs.="<a href=\"".$url."page=".$pages."\">末页</a>";    //最后一页
        } else {
            $navs .= "<a href=\"".$url."page=".$pages."\">下页</a>";
            $navs .= "<a href=\"".$url."page=".$pages."\">末页</a>";
        }
        echo "$navs";
   }
}

/**
 * 获取文章第一张图片做为缩略图
 * @param $content
 * @return bool|string
 */
function get_thumb($str){
   $pattern="/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png]))[\'|\"].*?[\/]?>/";  
   $content = $str;  //文章内容  
   preg_match_all($pattern,$content,$matchContent);  
   if(isset($matchContent[1][0])){  
       $art_pic=$matchContent[1][0];  
   }else{  
      $art_pic="";//在相应位置放置一张命名为no-image的jpg图片  
   }
   return $matchContent[1][0];
}

//获取文章的全部图片
function get_Allpic($str){
   $pattern="/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png]))[\'|\"].*?[\/]?>/";  
   $content = $str;  //文章内容  
   preg_match_all($pattern,$content,$matchContent);  
   if(isset($matchContent[1])){  
       $art_pic=$matchContent[1];  
   }else{  
      $art_pic="";//在相应位置放置一张命名为no-image的jpg图片  
   }
   return $matchContent[1];
}

//判断是否为空
function isNull($str)
{
	if ($str==NULL)
	{
		echo '<script charset=\"utf-8\">alert("输入不能为空，请重新填写！");location.href="javascript:history.go(-1)";</script>';
		exit;
	}
	else
	return $str;
}


/**
 * 功能：邮件发送函数
 * @param string $to 目标邮箱
 * @param string $title 邮件主题（标题）
 * @param string $to 邮件内容
 * @return bool true
 */
function sendMail($to, $title, $content) {
    vendor('PHPMailer.class#smtp');
    vendor('PHPMailer.class#phpmailer');
    $mail = new \PHPMailer();
    // 装配邮件服务器
    $mail -> IsSMTP(); //使用SMTP方式发送  
    $mail -> SMTPAuth = true; //设置服务器是否需要SMTP身份验证    
    $mail->Host=C('MAIL_HOST'); //smtp服务器的名称（这里以QQ邮箱为例）
	$mail->SMTPAuth = C('MAIL_SMTPAUTH'); //启用smtp认证
	$mail->Username = C('MAIL_USERNAME'); //你的邮箱名
	$mail->Password = C('MAIL_PASSWORD') ; //邮箱密码
	$mail->From     = C('MAIL_FROM'); //发件人地址（也就是你的邮箱地址）
	$mail->FromName = C('MAIL_FROMNAME'); //发件人姓名
	$mail->AddAddress($to);
	$mail->WordWrap = 50; //设置每行字符长度
	$mail->IsHTML(C('MAIL_ISHTML')); // 是否HTML格式邮件
	$mail->CharSet=C('MAIL_CHARSET'); //设置邮件编码
	$mail->Subject =$title; //邮件主题
	$mail->Body = $content; //邮件内容
	$mail->AltBody = "这是一个纯文本的身体在非营利的HTML电子邮件客户端"; //邮件正文不支持HTML的备用显示

    // 发送邮件
    if (!$mail->Send()) {
        return false;
    } else {
        return TRUE;
    }
}


?>
